<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>promise,async,await</title>
</head>
<body>
  <script>
    // // 一个Promise 只能执行一个 res 或者 rej 函数
    // new Promise((res,rej)=>{
    //   setTimeout(()=> {
    //     //即使res("ok")在前也是异步的，先执行console.log(11)
    //     //但是res("ok")会排在延时器的前面
    //     res("ok")
    //     console.log(11)
    //     setTimeout(()=>{
    //       console.log(33)
    //     },0)
    //   },100)
    //   setTimeout(()=> {
    //     console.log(22)
    //     rej("err")
    //   },200)
    // }).then(res=>{
    //   console.log(res)
    // }).catch(rej=>{
    //   console.log(rej)
    // })
    // // 上面例子打印结果  11 ok 33 22 

    // //new Promise 返回Promise对象
    // // Promise对象也可以调用then 和 catch 前提是该 then 和 catch未被调用
    // var a = new Promise((res,rej)=>{
    //   setTimeout(()=> {
    //     res("ok")
    //   },100)
    // })
    // a.then(res=>{
    //   console.log(res) // ok
    // })

    // // Promise 可链式调用
    // var b = new Promise((res,rej)=>{
    //   setTimeout(()=> {
    //     res("ok")
    //   },100)
    // })
    // b.then(res=>{
    //   console.log(res) // ok
    //   return new Promise((res,rej)=>{
    //     setTimeout(()=> {
    //       // res("okk") // 走then
    //       rej("okk") // 走catch
    //     },100)
    //   })
    // }).then(res=>{
    //   console.log(res) // okk
    //   return new Promise((res,rej)=>{
    //     setTimeout(()=> {
    //       rej("no")
    //     },100)
    //   })
    // }).catch(rej=>{
    //   console.log(rej)
    // })

    // // Promise返回值
    // var c = new Promise((res,rej)=>{
    //   setTimeout(()=> {
    //     res("Promise返回值")
    //   },100)
    // })
    // var res = c.then(res=>{
    //   console.log(res)
    // })
    //  // 如果 then 或者 catch 有返回值 则 res为return 的返回值
    //  // 否则为回调入参 res 或 rej
    // console.log(res)

    // // 虽然Promise可以链式调用但是逻辑复杂时代码逻辑还是不够清晰，维护困难
    // // 解决方案
    // // async await
    // async function get(a){
    //   var res = a
    //   res = await new Promise((res,rej)=>{
    //     setTimeout(()=> {
    //       res(a*2)
    //     },1000)
    //   }).then(res=>{
    //     return res
    //   })
    //   console.log(res) // 20
    //   var num = res*2
    //   console.log(num) // 40
    // }
    // get(10)
 
    // promise再理解
    setTimeout(()=>{
      console.log(1,"----------")
    },0)
    new Promise(res=>{
      console.log(2,"-----------");
      for(var i = 0; i<200; i++) {
        if(i == 198) {
          console.log(3,"--------------")
          res()
        }
      }
      console.log(4,"------------");
    }).then(res=>{
      console.log(5,"--------------");
    })
    console.log(6,"----------");

    // Promise 本身是同步的 .then 和 .catch是异步的
    // 因为promise 的.then 和 .catch 是异步微任务，setTimeout 是异步宏任务
    // 所以Promise执行的队列优先度大于setTimeout
    //所以上述结果为 2 3 4 6 5 1

    var aa = 0;
    (aa = 1) && console.log(aa)
    // if(aa = 1) {
    //   console.log(aa)
    // }
  </script>
</body>
</html>